home *** CD-ROM | disk | FTP | other *** search
- #!/bin/bash
- #
- # Orca
- #
- # Copyright 2006-2007 Sun Microsystems Inc.
- #
- # This library is free software; you can redistribute it and/or
- # modify it under the terms of the GNU Library General Public
- # License as published by the Free Software Foundation; either
- # version 2 of the License, or (at your option) any later version.
- #
- # This library is distributed in the hope that it will be useful,
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- # Library General Public License for more details.
- #
- # You should have received a copy of the GNU Library General Public
- # License along with this library; if not, write to the
- # Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- # Boston, MA 02111-1307, USA.
-
- # This script performs some clean up and will run Orca. It will also
- # rerun Orca if it detects that Orca died an unnatural death.
-
- # __id__ = "$Id: orca.in,v 1.22 2006/12/08 16:21:25 wwalker Exp $"
- # __version__ = "$Revision: 1.22 $"
- # __date__ = "$Date: 2006/12/08 16:21:25 $"
- # __copyright__ = "Copyright (c) 2005-2006 Sun Microsystems Inc."
- # __license__ = "LGPL"
-
- # Set the user's $PATH for this script.
- #
- export PATH="/usr/ccs/bin:/usr/bin:/usr/sbin:/bin:/usr/sfw/bin:/usr/openwin/bin:/usr/X11R6/bin"
-
- # If you set RUNONCE to "true", then this will just run Orca once and quit.
- #
- RUNONCE="false"
-
- # A value of 1 means to run Orca. A value of 0 means quit.
- #
- RUN=1
-
- # Initially there will be no watchdog process id.
- #
- watchdog_pid=0
-
- # Save the arguments away.
- #
- ARGS="$*"
-
- # The watchdog will periodically ping Orca to see if it is responding.
- # If orca isn't responding, the watchdog will kill the Orca process.
- # The watchdog logic requires 'wget', so we won't do it if we can't
- # find wget in the path. Note also that you can force WATCHDOG=0 if you
- # do not want a background process that periodically pings Orca to see
- # if it is responding.
- #
- IFS=:
- WGETCMD=
- WATCHDOG=0
- for dir in $PATH:/usr/sfw/bin:/usr/local/bin; do
- test -x "$dir/wget" && {
- WGETCMD="$dir/wget"
- WATCHDOG=1
- break
- }
- done
-
- # Cleans up any orca-related processes that might be running,
- # restricting it to those processes owned by the user. These include
- # orca itself, any gnome-speech synthesis drivers, and festival
- # processes running in server mode.
- #
- cleanup()
- {
- USERID=`id | cut -f2 -d= | cut -f1 -d\(`
- PIDS=`ps -eo pid,ruid,args | grep $USERID | egrep "orca[.]orca|synthesis-driver|festival [-][-]server" | grep -v grep | awk '{ print $1 }'`
-
- IFS='
- '
- PIDS=`echo $PIDS`
-
- if [ "x$PIDS" != "x" ]
- then
- kill -9 $PIDS > /dev/null 2>&1
- fi
- }
-
- # Runs orca.
- #
- runOrca()
- {
- if [ -z "$1" ]
- then
- cleanup
- fi
- exec_prefix=/usr
- PYTHONPATH=${exec_prefix}/lib/python2.5/site-packages
- export PYTHONPATH
-
- # We'll save and restore the Caps_Lock as a modifier just in case
- # the user is using the Caps_Lock as the Orca modifier key.
- #
- if [ "x$DISPLAY" != "x" ]
- then
- CAPSLOCKSETTING=`xmodmap | grep Caps_Lock | cut -f1`
- fi
- /usr/bin/python -c "import orca.orca; orca.orca.main()" "$ARGS"
- if [ "x$CAPSLOCKSETTING" != "x" ]
- then
- xmodmap -e "add $CAPSLOCKSETTING = Caps_Lock"
- fi
- }
-
- # Runs a watchdog process in the background. It merely attempts to
- # get to Orca via some other means than the AT-SPI. Here we use
- # Orca's http server at port 20433. If it doesn't respond, then
- # we assume Orca is dead.
- #
- watchdog()
- {
- (
- sleep 30 # Give orca a chance to start.
- while [ "$WATCHDOG" -gt 0 ]
- do
- sleep 5
- USERID=`id | cut -f2 -d= | cut -f1 -d\(`
- PID=`ps -eo pid,ruid,args | grep $USERID | egrep "orca[.]orca" | grep -v grep | awk '{ print $1 }'`
-
- if [ "x$PID" = "x" ]
- then
- exit
- else
- $WGETCMD -q -t 0 -O /dev/null -w 2 "http://localhost:20433" || {
- echo Orca watchdog detected something bad. Cleaning up.
- cleanup
- }
- fi
- done
- ) &
- }
-
- kill_watchdog()
- {
- if [ "x$watchdog_pid" != x0 ]
- then
- kill -9 $watchdog_pid > /dev/null 2>&1
- fi
- }
-
- kill_orca()
- {
- kill_watchdog
- cleanup
- exit
- }
-
- hup_orca()
- {
- cleanup
- }
-
- main()
- {
- if [ "$WATCHDOG" -gt 0 ]
- then
- watchdog
- watchdog_pid=$!
- fi
- while [ "$RUN" -gt 0 ]
- do
- runOrca &
- orca_pid=$!
- wait $orca_pid
-
- RUN=$? # quit on a normal exit status from Orca
-
- # We will stop re-running Orca on SEGV's (139 = SEGV + 128).
- # The reason for this is that there are cases where Python
- # will SEGV when Orca attempts to exit normally. This happens
- # because of something going on in pyorbit. This should be
- # fixed in pyorbit 2.14.1, but not everyone has that.
- # So...we'll check for it.
- #
- if [ "$RUN" -eq 139 ]
- then
- RUN=0
- fi
-
- # We will also stop re-running Orca on KILL's (137 = KILL + 128).
- # The reason for this is that if someone has done a "kill -KILL"
- # on the Python process, it was probably on purpose and they want
- # everything to die.
- #
- if [ "$RUN" -eq 137 ]
- then
- RUN=0
- fi
- done
- kill_watchdog
- }
-
- trap kill_orca QUIT TERM INT ABRT
- trap hup_orca HUP
-
- # Orca will fall into a text-based question and answer session if the
- # user has not configured orca and/or accessibility yet. We will
- # force that to happen in the foreground (i.e., RUNONCE=true). In
- # addition, if the user passes any command line arguments to orca, we
- # will run it in the foreground as well to avoid a situation where
- # orca dumps itself into the text-based setup utility.
- #
- # We make a special exception for gdm, which is used to handle the
- # accessible login. If we're running as gdm, we assume everything is
- # all set and we don't need to muck around.
- #
- if [ "x$LOGNAME" != "xgdm" ]
- then
- ACCESSIBILITY_ENABLED=`gconftool-2 --get /desktop/gnome/interface/accessibility`
- if [ "x$ACCESSIBILITY_ENABLED" != "xtrue" ]
- then
- # Because we will be running Orca in text-setup mode, we want to
- # make sure it is run in a terminal window. If we're already in
- # a terminal, this is great. If not, we spawn a gnome-terminal
- # and run orca in it.
- #
- tty -s && IN_TTY="true" || IN_TTY="false"
- if [ "x$IN_TTY" = "xtrue" ]
- then
- RUNONCE="true"
- else
- exec gnome-terminal -x $0 $ARGS
- fi
- fi
- fi
-
- if [ "x$RUNONCE" = "xfalse" -a "x$ARGS" = "x" ]
- then
- main
- else
- if [ `grep -c "\-q" <<< $ARGS` -gt 0 ]
- then
- cleanup
- else
- # If the user passed in a flag that results in orca only
- # outputting data to the console, don't kill any other orca
- # process. We do this by looking for flags that *should*
- # result in a cleanup (i.e., every legal command except
- # -?, --help, -v, and --version). This way, if the user
- # erroneously types an illegal command line argument, the
- # help text is emitted and the other orca is not killed.
- #
- if [ `egrep -c "\-s|\-g|\-t|\-n|\-u|\-e|\-d" <<< $ARGS` -eq 0 ]
- then
- runOrca "NO_CLEANUP"
- else
- runOrca
- fi
- fi
- fi
-